﻿using System;
using System.ComponentModel;
using System.Windows.Forms;
using JetBrains.Annotations;
using Kaleida.ServiceMonitor.Model;

namespace Kaleida.ServiceMonitor.UI
{
    public partial class ScriptEditorControl : UserControl
    {
        private DateTime lastKeyUpTime = DateTime.MinValue;

        [NotNull]
        private IScriptSource script = new NullScriptSource();

    	public event EventHandler SaveRequested;

        public ScriptEditorControl()
        {
            InitializeComponent();
            textBox.KeyDown += TextBoxKeyDownHandler;
            UpdateUI();
        }

        [NotNull]
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public IScriptSource Script
        {
            get { return script; }
            set
            {
                if (value == null) throw new ArgumentNullException("value");
                script = value;
                UpdateUI();
            }
        }

        private void TextBoxKeyDownHandler(object sender, KeyEventArgs e)
        {
			if (e.Control)
			{
				switch (e.KeyCode)
				{
					case Keys.A:
						textBox.SelectAll();
						e.SuppressKeyPress = true;
						e.Handled = true;
						break;
					case Keys.S:
						OnSaveRequested(this, EventArgs.Empty);
						e.Handled = true;
						break;
				}
			}

        	base.OnKeyDown(e);
        }

    	private void OnSaveRequested(object sender, EventArgs args)
    	{
    		if (SaveRequested != null)
    			SaveRequested(sender, args);
    	}

    	private void UpdateUI()
        {
            textBox.Enabled = !(script is NullScriptSource);
            textBox.Text = script.Content;
        }

        private void textBox_KeyUp(object sender, KeyEventArgs e)
        {
            lastKeyUpTime = DateTime.Now;
        }

        private void changeDetectionTimer_Tick(object sender, EventArgs e)
        {
            var delaySinceKeyPressed = (DateTime.Now - lastKeyUpTime) > TimeSpan.FromMilliseconds(500);
            if (delaySinceKeyPressed && textBox.Text != script.Content)
            {
                script.Content = textBox.Text;
                Focus();
            }

        }
    }
}
